package com.pan.common.barrier.filter;

import lombok.extern.slf4j.Slf4j;
import org.springframework.core.Ordered;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;

import java.io.IOException;

/**
 * filter与拦截器的差别
 *作用域差异：
 *  Filter是Servlet规范中规定的，只能用于WEB中，
 *  拦截器既可以用于WEB，也可以用于Application、Swing中
 * （即过滤器是依赖于Servlet容器的，和它类似的还有Servlet中的监听器同样依赖该容器，而拦截器则不依赖它）；
 * 规范差异：Filter是Servlet规范中定义的，是Servlet容器支持的，而拦截器是Spring容器内的，是Spring框架支持的；
 * 资源差异：拦截器是Spring的一个组件，归Spring管理配置在Spring的文件中，可以使用Spring内的任何资源、对象
 *  （可以粗浅的认为是IOC容器中的Bean对象），而Filter则不能使用访问这些资源；
 * 深度差异：Filter只在Servlet前后起作用，而拦截器可以深入到方法的前后、异常抛出前后等更深层次的程度作处理
 *  （这里也在一定程度上论证了拦截器是利用java的反射机制实现的），所以在Spring框架中，优先使用拦截器；
 * 注意：
 *    使用@WebFilter注解，必须在Springboot启动类上加@ServletComponentScan注解，否则该注解不生效，过滤器无效！
 * @author by panstark
 * @description
 * @notice
 * @date 2020/11/27
 */
@Slf4j
//@WebFilter(urlPatterns = {"/*"}, filterName = "initFilter")
public class InitFilter implements Filter, Ordered {

    @Override
    public void init(FilterConfig filterConfig){
        log.info("-----come into InitFilter init------");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        log.info("--------come into InitFilter and do processes--------");

        // 实际业务处理，这里就是下面图中的before doFilter逻辑
//        HttpServletRequest HRrequest = (HttpServletRequest) request;
//        Cookie[] cookies = HRrequest.getCookies();
//        if (cookies != null) {
//            for (Cookie cookie : cookies) {
//                if (cookie.getName().equals("loginUser")) {
//                    log.info("find loginUser: " + cookie.getValue());
//                    break;
//                }
//            }
//        }

        // 当前过滤器处理完了交给下一个过滤器处理,一定要写，否则就断了
        chain.doFilter(request, response);

        log.info("--------InitFilter's process has completed!---------");
    }

    @Override
    public void destroy() {
        log.info("--------come into InitFilter destroy-------------");
    }

    @Override
    public int getOrder() {
        return 2;
    }
}
